iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
自我挑戰組

ROS 筆記:要怎麼叫無人機自己飛系列 第 5

【ROS 筆記:要怎麼叫無人機自己飛】Day 5:要怎麼建立一個 ROS 套件(Package)

  • 分享至 

  • xImage
  •  

在 Day 3 時提到,在 ROS 系統中套件(Package)是開發機器人軟體的最基本單位,這篇要來實際跑一遍建立套件的流程。

不過這個過程稍微複雜一些,若只是開發練習用或小型專案,可以省略這個步驟。如果想要直接開始寫 ROS 節點,可以直接看下一篇。

建立 ROS 工作區

在建立套件之前,需要先建立一個工作區(Workspace)。工作區是用來給管理 ROS 專案的特殊資料夾,專案內使用或建立的套件、各種檔案都會放在裡面。

使用 catkin 建立工作區

我們需要使用 catkin 這套建立與管理工具,它會為一個普通的資料夾自動生成各種必須的資訊,將其轉換成 ROS 工作區,以利後續的開發工作。這個工作區一般只要建立一次即可。

  1. 建立 catkin workspace:

    在終端機輸入以下指令,系統會在 home 目錄新建一個名為 catkin_ws 目錄(也可以取其他名稱,通常都會用 _ws 結尾 ),並在其中創建一個 src 資料夾。

    $ mkdir -p ~/catkin_ws/src
    
  2. 編譯整個工作區:

    回到 catkin_ws 目錄,透過 catkin_make 指令讓 catkin 編譯此目錄下所有的 ROS 專案,為所有 ROS 套件自動生成可執行文件、函式庫和其他必要的檔案。

    $ cd ~/catkin_ws/
    
    $ catkin_make
    

    第一次執行該指令後,會看到 catkin_ws 目錄中多了 builddevel 這兩個目錄,原本的 src 目錄裡面也新增了一個 CMakeLists.txt 的檔案。

    catkin_ws 目錄內的東西

    • src (Source Space):src 是給開發者用來放各項專案和套件的地方。而方才新增的 CMakeLists.txt 是 catkin 結合了 CMake 系統(一種跨平台自動化建構系統,是「Cross-platform Make」的縮寫),讓程式可以支援跨平台建置的組態文件。

    • build(Build Space): build 是一個臨時目錄,用於存放執行 catkin_make 過程中生成的中間檔案。

    • devel(Development Space):devel 這個目錄包含了 ROS 套件的建構結果,例如可執行檔、函式庫、標頭檔等。

  3. 設置環境變數:

    編譯完成後,需要輸入 source ~/.bashrc 指令將工作區的環境變數載入到當前的 shell 中。

    如果如果你希望每次打開終端機時,都可以自動載入這個工作區的環境變數,可以執行 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc 這行指令,將前一條指令加入~/.bashrc檔案中。 這樣每次開啟新的終端機時,都可以直接執行 ROS 指令。

    $ source devel/setup.bash
    
    $ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
    

建立和使用 ROS 套件

catkin_create_pkg 建立套件

每次建立一個全新的 ROS 套件,可以按照以下步驟:

  1. 前往 catkin_ws/src ,利用 catkin 工具的 catkin_create_pkg 指令來建立套件。

    格式:

    catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
    
    • <package_name>:自己定義的套件名稱。
    • [depend1]:建立套件時預先設定好一系列相依套件。

    這裡示範建立一個名為 my_package 的套件,並且設定幾個相依套件:std_msgs(設定標準的訊息資料結構)、rospy(可以用 Python 撰寫節點)、roscpp(可以用 C++ 撰寫節點)。

    $ catkin_create_pkg my_package std_msgs rospy roscpp
    
  2. 查看 my_package 目錄中可以看到檔案結構如下:

    ~/catkin_ws/src/my_package$ tree
    .
    ├── CMakeLists.txt
    ├── package.xml
    └── src
    
    • CMakeLists.txt:這是 ROS 自動生成給 CMake 建置用的文件,除了整個 catkin workspace 有一個外,每一個套件自己也會有一個。

    • package.xml:這是 ROS 自動生成的套件清單(Package Manifests),用於描述 ROS 套件的詮釋資料檔(Metadata file),它會包含套件名稱、版本、作者資訊、有哪些相依套件等。

    • src:這是用於儲存套件程式碼的地方。

  3. 這時回到 catkin_ws 目錄,再次執行 catkin_make 指令,會顯示以下資訊,代表已經為剛才建立的 my_package 套件建立好必須的相依套件了。

    $ catkin_make
    
    # ...前面省略
    
    -- Found PythonInterp: /usr/bin/python3 (found version "3.8.10") 
    -- Using Python nosetests: /usr/bin/nosetests3
    -- catkin 0.8.10
    -- BUILD_SHARED_LIBS is on
    -- BUILD_SHARED_LIBS is on
    -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    -- ~~  traversing 1 packages in topological order:
    -- ~~  - my_package
    -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    -- +++ processing catkin package: 'my_package'
    -- ==> add_subdirectory(my_package)
    -- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
    -- Configuring done
    -- Generating done
    
    # ...後面省略
    

    之後如果有對套件做較大幅度的修改,最好都回到工作區執行一次 catkin_make 指令。

安裝現成的套件

在 ROS index 和 GitHub 上也可以找到不少套件可用,這裡找一個教學用專案 Two wheeled robot 來示範如何安裝。

  1. 下載專案到工作區的 src 目錄底下。這個專案裡面包含了 m2wr_descriptionm2wr_motion_plan 兩個套件。

    $ cd ~/catkin_ws/src
    
    $ git clone https://github.com/sulibo/two_wheeled_robot_ROS_tutorial.git
    
  2. 安裝相依套件後,回到工作區目錄執行編譯。

    $ cd ..
    
    $ rosdep install --from-paths src --ignore-src -r
    
    $ catkin_make
    
  3. 執行完上列步驟後,可以執行以下指令,這會開啟 Gazebo 模擬器(在更後面的文章會詳細介紹),並且在模擬環境中載入一台兩輪小車機器人。

    $ roslaunch m2wr_description spawn.launch 
    


雖然這一篇建立的套件看起來不怎麼複雜,只有 src 是開發者真的會用到的部份,但是我覺得 ROS 的套件其實是個滿複雜的概念。從上面 Two wheeled robot 套件的目錄就可以看到一個完整的套件裡還有更多東西,其中幾個部份我會在之後跑模擬環境時再詳細介紹。

下一篇會來講怎麼寫 ROS 節點,真的可以開始寫程式了。


上一篇
【ROS 筆記:要怎麼叫無人機自己飛】Day 4:安裝 ROS 與環境配置
下一篇
【ROS 筆記:要怎麼叫無人機自己飛】Day 6:使用 Python 撰寫 ROS 節點(Node)
系列文
ROS 筆記:要怎麼叫無人機自己飛25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言